iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
1
Google Developers Machine Learning

Towards Tensorflow 2.0系列 第 18

[Day-18] LSTM - 股價預測 (Data: 台灣50 )

  • 分享至 

  • xImage
  •  

今天來嘗試另外一個LSTM經典案例 - 股票預測,股票也是時間序列型資料!過去,金融業希望能找出一個強而有力的模型,不管預測股票或者期貨等等標的。但,似乎目前都還未有一個非常powerful的標的。也有可能有人已經做出來,只是不願意release,畢竟做出來 = 發大財。而針對金融相關標的的預測,以前看過一些paper以及方法。像是希望能利用情感分析等外部資訊來增加預測水準 (Ex: 輿情,最近股票市場可能跟川普發文有正相關吧XD )。因此,也可以利用上一篇情感分析的方法,來做為股票預測的特徵。現在許多人嘗試使用Deep Reinforcement Learning (DRL) 來預測股票,套一句李教授說的話 "硬train一發"。
https://ithelp.ithome.com.tw/upload/images/20191003/20119971W64n8Yxxm1.png

這次使用的是台灣50的股票預測,台灣50就是一次幫你買進台灣最大的50檔股票 (Ex: TSMC),這些股票又稱為ETF。接下來就開始今天的實作。

首先可以直接讀資料看一下資料樣態

stock = pd.read_csv('stock50.csv')
stock.head()

https://ithelp.ithome.com.tw/upload/images/20191003/20119971rZvw33NCfH.png

資料欄位包含了

資料欄位 內容
Stock_num 股票編號
Date 日期
Open 開盤價
High 最高價格
Min 最低價格
Close 收盤價格
Stock_trade 交易量

知道欄位後,接下來可以做一些前處理,Ex: Max - Min Normalize。此外,因為我們要預測的是收盤價格,所以會需要shit日期

def normalize(df):
    norm = df.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
    return norm

stock = stock.dropna()
stock['y'] = stock['Close'].shift(-1)
stock.iloc[:,2:4] = normalize(stock.iloc[:,2:4])
stock.head()

因為我們要針對時間序列資料做前處理,並做成可以預測的樣態 (Ex: 五天預測一天,或者十天預測一天)。

def train_windows(df, ref_day=5, predict_day=1):
    X_train, Y_train = [], []
    for i in range(df.shape[0]-predict_day-ref_day+1):
        X_train.append(np.array(df.iloc[i:i+ref_day,:-1]))
        Y_train.append(np.array(df.iloc[i+ref_day:i+ref_day+predict_day]["y"]))
    return np.array(X_train), np.array(Y_train)

接下來就可以train一發了,上一篇我們是自己寫LSTM function,這次嘗試改用tf.keras.Sequential的方式來執行,就像是:

class stock_lstm(keras.Model):
  def __init__(self,units):
      super(stock_lstm, self).__init__()
      self.rnn = Sequential([
          layers.SimpleRNN(units,input_shape=(5,2),dropout=0.2,return_sequences=True,unroll=True),
          layers.SimpleRNN(units,dropout=0.2,unroll=True)])
      self.fc = layers.Dense(32)
      self.out = layers.Dense(1)
  def call(self, inputs, training=None):
      x = self.rnn(inputs)
      x = self.fc(x)
      out = self.out(x)
      return out

這樣是不是看起來很方便,且直觀,更像以前在使用 keras api 的方法!

接下來就可以直接model compile以及model.fit了!針對股票預測的部分,loss可以選擇MAE,MSE 等等 loss function,就不能選擇crossentropy的方法了!

rnn_model = stock_lstm(units)
rnn_model.compile(optimizer  =keras.optimizers.Adam(),loss="mean_absolute_error",metrics=['mean_absolute_error'])
rnn_model.fit(data,epochs=epochs, validation_data = data_test,shuffle=True)

小結:

今天跑完LSTM的股票應用,以前研究所時,本魯也曾經在金融業實習過,當初所預測的標的是期貨相關產品 ,也很許多金融業前輩學習到很多。也很感謝當時後的長官,因為資料科學或是做模型真的很需要Domain Know how,當時候學到了許多基本的金融指標。感謝大家漫長閱讀~明天應該會來看一些新的模型!

一天一梗圖:

https://ithelp.ithome.com.tw/upload/images/20191003/20119971wwHwFG4CuJ.png
source

Reference

LSTM_Stock_predict_colab

LSTM

Kaggle_LSTM


上一篇
[Day-17] LSTM - Sentiment Analysis (Data: Twitter)
下一篇
[Day-19] BERT 初探
系列文
Towards Tensorflow 2.030
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
existedinnettw
iT邦新手 5 級 ‧ 2021-12-10 13:19:56

請問一下使用 min max normalization 是否意味predict_y 之後要再denormalization?
有其它方式試合股票的normalization嗎?

我要留言

立即登入留言